Powershell ile Dosya Silme Ve Loglama
Merhaba depolama alanlarımızı doğru yönetmemiz gerekmekte sınırsız alanlara sahip değiliz maalesef. Daha önce iş hayatımda karşılaştığım bir sorun için oluşturduğum powershell’i gündelik hayata uyarlayarak sizinle paylaşmak istedim. Bu powershell script’in amacı belirli bir dosya yolundaki yine belirli bir tarihten eski olanları silmesi ve sildiği dosyaların boyut,isim,dosyanın oluşturuldu tarihi bir .txt dosyasına log olarak yazmak ve artı olarak oluşturduğu .txt dosyasının adına script’in çalıştığı tarihi eklemesi . Bahsettiğim gibi depolama alanlarımız bizim için kıymetli bu yüzden düzenli olarak bunları temizliyor olmalıyız. bu script’i sizde ister sunucularınız ister client bilgisayarlarınızda kullanabilirsiniz. Ancak ben burada gündelik hayattan bir örnek vererek yazılımın, script’lerin hayatımızı nasıl kolaylaştırdığını vurgulamak istedim.
Örneğimiz downloads klasörü üzerinden olacak her zaman internetten belirli şeyler indiririz ve unuturuz ancak bu indirmeler depolama birimimizde yer işgal etmekte ve artık ihtiyacımız olmayabilir. Hadi script üzerinden bakalım.
# Hedef dizini ve alt dizinlerdeki dosyaları al ve belirli bir tarihten eski olanları seç
$targetPath = "C:\Users\İsminiz\Downloads"
$cutOffDate = (Get-Date).AddDays(-3) # Örnek olarak 3 gün önceye ayarlandı, gerektiği gibi değiştirilebilir
$oldFiles = Get-ChildItem –Path $targetPath -Recurse | Where-Object { $_.LastWriteTime -lt $cutOffDate }
# Silinen dosyaların bilgilerini içerecek bir dizi oluştur
$deletedFileInfos = @()
# Dosyaları sil, dosyanın adını ve silinme tarihini kaydedin
foreach ($file in $oldFiles) {
$deletedDate = Get-Date # Silinme tarihi, her bir dosya için işlem yapıldığında kaydedilecek
Remove-Item $file.FullName
$fileInfo = "Dosya Adı: $($file.Name), Boyut: $($file.Length) bytes, Silinme Tarihi: $deletedDate"
$deletedFileInfos += $fileInfo
}
# Silinen dosyaların bilgilerini bir metin dosyasına ekleyin (var olan bir dosyaya ekler)
$deletedFileInfos | Out-File -FilePath "C:\Users\İsminiz\Downloads\SilinenDosyalar.txt"
# Scriptin çalıştığı tarihi al
$scriptRunDate = Get-Date
# Yeni dosya adını oluştur
$newFileName = "SilinenDosyalar_" + $scriptRunDate.ToString("yyyy.MM.dd") + ".txt"
# Dosyanın adını değiştir
Rename-Item -Path "C:\Users\İsminiz\Downloads\SilinenDosyalar.txt" -NewName "C:\Users\İsminiz\Downloads\$newFileName"
Şimdi ilk aşama da $targetPath değişkenimizin içine sileceğimiz dosyaların bulunduğu yeri tutuyoruz.$cutOffDate = (Get-Date).AddDays(-3) bugünün tarihinden 3 gün eski olan dosyaları istediğim için AddDays(-3) parametresini giriyorum. $oldFiles = Get-ChildItem –Path $targetPath -Recurse | Where-Object { $_.LastWriteTime -lt $cutOffDate } son okarakta $oldFiles değişkeninin içerisine Get-ChildItem –Path $targetPath -Recurse yani belirtiğim dosya yolu altındaki tüm dosyaları(-Recurse parametresi) getir diyorum. Hadi bakalım sonuca;

Gördüğünüz gibi script’i bu kısma kadar çalıştırıp sonrasında $oldFiles değişkenini çağırırsanız 3 günden eski olan dosyaları listeleyecektir.
Devam edelim $deletedFileInfos = @() boşi bir dizi oluşturuyorum. Daha sonrasın da bu dizinin içini $fileInfo = “Dosya Adı: $($file.Name), Boyut: $($file.Length) bytes, Silinme Tarihi: $deletedDate” komutu ile $deletedFileInfos += $fileInfo diyerek doldurmuş oluyorum. $deletedDate = Get-Date ile silindiği tarihi alıyorum. $file.Length diyerek dosya boyutunu alıyoruz.
Son olarak da artık 3 günden eski dosyaları yakaladık. Silinecek dosyanın adını aldık, boyutunu aldık, silinme tarihini aldık ve bu bilgileri dizi içersin de tutuyoruz. $deletedFileInfos | Out-File -FilePath “C:\Users\İsminiz\Downloads\SilinenDosyalar.txt” diyerek artık sildiğimiz dosyaların bilgilerini içeren bir .txt dosyayı oluşturuyoruz ve işlemi tamamlamış oluyoruz. Kodun geri kalan kısmı aslında biraz ihtiyaca binaen yapılmış bir kısım isterseniz kullanmak zorunda değilsiniz. Ancak ben script’i task scheduler’a koyduğum için böyle bir kısım ekledim ve iş hayatında log çok önemli 🙂
# Scriptin çalıştığı tarihi al
$scriptRunDate = Get-Date
# Yeni dosya adını oluştur
$newFileName = "SilinenDosyalar_" + $scriptRunDate.ToString("yyyy.MM.dd") + ".txt"
# Dosyanın adını değiştir
Rename-Item -Path "C:\Users\İsminiz\Downloads\SilinenDosyalar.txt" -NewName "C:\Users\İsminiz\Downloads\$newFileName"
Yukarda ki kısımda aslında yaptığımız şey şu script ne zaman çalışıyor ise örneğin script çalıştı ve dosyaları sildi SilinenDosyalar.txt isimli bir dosya oluştu Bu oluşan dosyanın ismini SilinenDosyalar_2024.02.16.txt olarak değiştirmeyi sağlıyor bu tarihte script’in çalıştığı tarih

Ve Log dosyamınız içerisi de böyle;

Son olarak dediğim gibi bu script’i task scheduler oluşturup aylık olarak çalıştırabilirsiniz. Ekstra olarak bunu sadece belirli uzantılara sahip 3 günden eski dosyaları sil gibi modifikasyonlarla daha amaca yönelik hale dönüştürebilirsiniz. İyi okumalar 🙂


